
/**
 * 将多个函数组合为复合函数 (经典函数通用)
 * @param  {...any} funcs 
 */
export function compose(...funcs) {
    if (funcs.length === 0) {
        return args => args; // 如果没有要组合的函数，则返回的函数原封不动的返回参数 (args 就是 store.dispatch)
    }
    if (funcs.length === 1) {
        return funcs[0] // 组合函数只有一个
    }
    // return function (...args) {
    //     let lastReturn = null; // 函数返回值得到下一个中间件参数 action  
    //     for (let i = funcs.length - 1; i >= 0; i--) {
    //         const func = funcs[i]; // func 就是 next => acton => {} 函数
    //         if (i === funcs.length - 1) { // 数组最后一项
    //             lastReturn = func(...args); // lastReturn 实际就是 action => {} 函数形参为外部传入
    //         } else {
    //             lastReturn = func(lastReturn);
    //         }
    //     }
    //     return lastReturn // 最终 action 
    // }
    return funcs.reduce((a, b) => (...args) => a(b(...args))) //! 等价于上面方法
}